package com.line.tools.util;

import com.line.config.cons.BasicCons;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 反射工具类<br/>
 * 1.与反射相关公用操作的方法公用提取；<br/>
 * 2.该类可持续扩展，注意做好注释；
 * 
 * @author JustinYang
 * @version v1.0
 * @since 2016-07-11
 *
 */
public class ReflectUtils {
	private static Logger log = LoggerFactory.getLogger(ReflectUtils.class);

	public static void main(String[] args) throws Exception {
		Map<String, String> map = new HashMap<>();
		BasicCons commonStatic = new BasicCons();
		setFileds(commonStatic, map);
	}

	/**
	 * 通过传入的值进行静态化字段设置<br/>
	 * 1.通过反射获取所有的属性；<br/>
	 * 2.通过反射获取所有属性的类型；<br/>
	 * 3.通过缓存的Key匹配属性名称，相同则进行修改属性值<br/>
	 * 
	 * @param object
	 *            实体化对象
	 * @param map
	 *            需要进行修改的值
	 */
	public static void setFileds(Object object, Map<String, String> map) {
		Field[] fields = object.getClass().getDeclaredFields();// 通过反射获取所有的字段信息
		for (Field field : fields) { // 轮询字段
			try {
				String name = field.getName();
				String type = field.getType().getName();
				if (map.containsKey(name)) {
					String value = map.get(name);
					if ("boolean".equals(type)) {
						field.setBoolean(object, Boolean.parseBoolean(value));
					} else if ("byte".equals(type)) {
						field.setByte(object, Byte.parseByte(value));
					} else if ("char".equals(type)) {
						field.setChar(object, value.toCharArray()[0]);
					} else if ("short".equals(type)) {
						field.setShort(object, Short.parseShort(value));
					} else if ("int".equals(type)) {
						field.setInt(object, Integer.parseInt(value));
					} else if ("long".equals(type)) {
						field.setLong(object, Long.parseLong(value));
					} else if ("float".equals(type)) {
						field.setFloat(object, Float.parseFloat(value));
					} else if ("double".equals(type)) {
						field.setDouble(object, Double.parseDouble(value));
					} else {
						field.set(object, value);
					}
				}
			} catch (Exception e) {
				log.debug("set Field value has exception:" + "", e);
			}
		}
	}
}
